package course.examples.Graphics.CanvasBubble;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
public class BubbleActivity extends Activity {
protected static final String TAG = "BubbleActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final RelativeLayout frame = (RelativeLayout) findViewById(R.id.frame);
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.b128);
final BubbleView bubbleView = new BubbleView(getApplicationContext(),
bitmap);
frame.addView(bubbleView);
new Thread(new Runnable() {
@Override
public void run() {
while (bubbleView.move()) {
bubbleView.postInvalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.i(TAG, "InterruptedException");
}
}
}
}).start();
}
private class BubbleView extends View {
private static final int STEP = 100;
final private Bitmap mBitmap;
private Coords mCurrent;
final private Coords mDxDy;
final private DisplayMetrics mDisplayMetrics;
final private int mDisplayWidth;
final private int mDisplayHeight;
final private int mBitmapWidthAndHeight, mBitmapWidthAndHeightAdj;
final private Paint mPainter = new Paint();
public BubbleView(Context context, Bitmap bitmap) {
super(context);
mBitmapWidthAndHeight = (int) getResources().getDimension(
R.dimen.image_height);
this.mBitmap = Bitmap.createScaledBitmap(bitmap,
mBitmapWidthAndHeight, mBitmapWidthAndHeight, false);
mBitmapWidthAndHeightAdj = mBitmapWidthAndHeight + 20;
mDisplayMetrics = new DisplayMetrics();
BubbleActivity.this.getWindowManager().getDefaultDisplay()
.getMetrics(mDisplayMetrics);
mDisplayWidth = mDisplayMetrics.widthPixels;
mDisplayHeight = mDisplayMetrics.heightPixels;
Random r = new Random();
float x = (float) r.nextInt(mDisplayWidth);
float y = (float) r.nextInt(mDisplayHeight);
mCurrent = new Coords(x, y);
float dy = (float) r.nextInt(mDisplayHeight) / mDisplayHeight;
dy *= r.nextInt(2) == 1 ? STEP : -1 * STEP;
float dx = (float) r.nextInt(mDisplayWidth) / mDisplayWidth;
dx *= r.nextInt(2) == 1 ? STEP : -1 * STEP;
mDxDy = new Coords(dx, dy);
mPainter.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
Coords tmp = mCurrent.getCoords();
canvas.drawBitmap(mBitmap, tmp.mX, tmp.mY, mPainter);
}
protected boolean move() {
mCurrent = mCurrent.move(mDxDy);
if (mCurrent.mY < 0 - mBitmapWidthAndHeightAdj
|| mCurrent.mY > mDisplayHeight + mBitmapWidthAndHeightAdj
|| mCurrent.mX < 0 - mBitmapWidthAndHeightAdj
|| mCurrent.mX > mDisplayWidth + mBitmapWidthAndHeightAdj) {
return false;
} else {
return true;
}
}
}
}